package code.example.base.collection.map;

import code.example.tool.LogFactory;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.function.BiConsumer;

/**
 * Map 保存key ,value 的对应关系，提供了 put,remove,putIfAbsent,replace 方法。
 *  HashMap 内存持有一个数组，通过key的hashCode定位（HashCode取模）到数组(数组长度为2N次方)下标，数组内的元素是链表头部，
 *  遍历链表： hashCode相等&&value.equals相等，确定是同一个key值对象。
 *
 *  当链表长度大于8时，链表转换为TreeNode (红黑树实现)
 *
 *   未指定大小情况下，默认为0，put时触发resize 扩大为16，之后每次扩大2倍。
 *   指定大小情况下，容量== 最接近（大于） 指定大小的 2的N次方。
 *
 *   每次put之后，如果map.size() > 容量*负载因子，进行扩容。
 *
 *   HashMap 是非线程安全的。
 *
 *   如果put之后，key的hash code ,发生变化，有可以找不到value.
 *
 *   如果确切知道key有N个， capacity ==N/0.75
 *
 *   hashMap 的三个扩展点：
 *   void afterNodeAccess(Node<K,V> p) { }
 void afterNodeInsertion(boolean evict) { }
 void afterNodeRemoval(Node<K,V> p) { }

 */
public class TestHashMap {

    public void test(){
        int count = 100;
        Map<Integer,Integer > map = new HashMap<Integer,Integer>((int)(count/0.75));
        for(int i=0;i<count;i++){
            map.put(i,Integer.reverse(i));
        }

        map.forEach(new BiConsumer<Integer, Integer>() {
            @Override
            public void accept(Integer key, Integer value) {
                LogFactory.getLog().info("key:"+key+",value:"+value+" ,key:"+Integer.toBinaryString(key)+",value:"+Integer.toBinaryString(value));
            }
        });
    }
    public static void main(String args []){
        new TestHashMap().test();
    }
}
